package utils.common;

import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.util.TypedValue;
import android.view.View;

import com.shishi.tech.paipai.application.BaseApplication;

import log.LogManager;


/**
 * 类名称：ScreenTools
 * 类描述:  屏幕像素相关
 * 创建人：Administrator
 * 创建时间：2015年6月27日 上午11:31:28
 * 修改人：Administrator
 * 修改时间：2015年6月27日 上午11:31:28
 * 修改备注:
 *
 * @see
 */
public class ScreenTools {
    private static ScreenTools mScreenTools;
    private Context context;

    private ScreenTools(Context context) {
        this.context = context.getApplicationContext();
    }

    public static ScreenTools getInstance() {
        return getInstance(BaseApplication.getInstance().getBaseContext());
    }

    public static ScreenTools getInstance(Context context) {
        if (mScreenTools == null)
            mScreenTools = new ScreenTools(context);
        return mScreenTools;
    }

    public int dip2px(float f) {
        return (int) (0.5D + (double) (f * getDensity(context)));
    }

    public int dip2px(int i) {
        return (int) (0.5D + (double) (getDensity(context) * (float) i));
    }

    public int get480Height(int i) {
        return (i * getScreenWidth()) / 480;
    }

    public float getDensity(Context context) {
        return context.getResources().getDisplayMetrics().density;
    }

    public float getScaledDensity(Context context) {
        return context.getResources().getDisplayMetrics().scaledDensity;
    }

    public int getScal() {
        return (100 * getScreenWidth()) / 480;
    }

    public int getScreenDensityDpi() {
        return context.getResources().getDisplayMetrics().densityDpi;
    }

    public float getWHRatio() {
        return getScreenHeight() * 1.0f / getScreenWidth();
    }

    public int getScreenHeight() {
        return context.getResources().getDisplayMetrics().heightPixels;
    }

    public int getScreenWidth() {
        return context.getResources().getDisplayMetrics().widthPixels;
    }

    public float getXdpi() {
        return context.getResources().getDisplayMetrics().xdpi;
    }

    public float getYdpi() {
        return context.getResources().getDisplayMetrics().ydpi;
    }

    public int px2dip(float f) {
        float f1 = getDensity(context);
        return (int) (((double) f - 0.5D) / (double) f1);
    }

    public int px2dip(int i) {
        float f = getDensity(context);
        return (int) (((double) i - 0.5D) / (double) f);
    }


    public static float dpToPx(Context context, float dp) {
        if (context == null) {
            return -1;
        }
        return dp * context.getResources().getDisplayMetrics().density;
    }

    public static float pxToDp(Context context, float px) {
        if (context == null) {
            return -1;
        }
        return px / context.getResources().getDisplayMetrics().density;
    }

    public static int dpToPxInt(Context context, int dp) {
        return (int) (dpToPx(context, dp) + 0.5f);
    }

    public static int pxToDpCeilInt(Context context, float px) {
        return (int) (pxToDp(context, px) + 0.5f);
    }

    public static float px2sp(Context context, float size) {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, size,
                context.getResources().getDisplayMetrics());
    }

    public int sp2px(float spValue) {
        return (int) (spValue * getScaledDensity(context) + 0.5f);
    }


    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

    /**
     * 获取目标View在屏幕中的坐标
     *
     * @param targetView
     * @return targetRect 封装了坐标位置的rect
     */
    public Rect getGlobalVisibleRect(View targetView) {
        Rect targetRect = new Rect();
        if (targetView != null) {
            targetView.getGlobalVisibleRect(targetRect);//获取targetView在屏幕中的位置
        }
        LogManager.getLogger().i("targetRect", "left==" + targetRect.left + "\ntop==" + targetRect.top +
                "\nright==" + targetRect.right + "\nbottom==" + targetRect.bottom);
        return targetRect;
    }

    /**
     * 获取目标View在屏幕中的坐标
     * <p/>
     * 该坐标为已经修正过状态栏的坐标
     *
     * @param activity
     * @param targetView
     * @return
     */
    public Rect getGlobalVisibleRect(Activity activity, View targetView) {
        Rect targetRect = new Rect();

        if (targetView != null) {
            targetView.getGlobalVisibleRect(targetRect);//获取targetView在屏幕中的位置

            Rect outRect = new Rect();//修正状态栏的影响
            activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);

            targetRect.top = targetRect.top - outRect.top;//修正
            targetRect.bottom = targetRect.bottom - outRect.top;//修正
        }
        return targetRect;
    }
}
